﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Data;
using System.Data.SqlClient;
using System.Data.Sql;
using System.Configuration;

using UricaoWeb.Datos.ConexionBD.Propiedad;
using UricaoWeb.Datos.Excepciones.Tours;

namespace UricaoWeb.Datos.ConexionBD.Tours
{
    public class OperacionesTour
    {
        private string _accion = "";
        private string _conexion = "data source=(LocalDB)\v11.0; initial catalog=UricaoBD;integrated security=true";

        public OperacionesTour() { }


        #region Metodos

        #region Metodos privados

        /// <summary>
        /// Función que realiza la conexión a base de dato
        /// y convierte el comando en un stored procedure 
        /// para poder ser accedido
        /// </summary>
        /// <param name="procedimiento"> Nombre del stored procedure </param>
        /// <param name="conexion"> Conexion abierta </param>
        /// <returns>
        /// Returna el comando de establecimiento de conexión según 
        /// el stored procedure requerido
        /// </returns>
        private SqlCommand ConsultarProcedimientoAlmacenado(string procedimiento, SqlConnection conexion)
        {
            SqlCommand comando = new SqlCommand(procedimiento, conexion);
            comando.CommandType = CommandType.StoredProcedure;
            return comando;
        }


        /// <summary>
        /// Definición global de los procedimientos dentro de la BD 
        /// por medio de palabras claves
        /// </summary>
        /// <param name="accion">Palabra clave </param>
        /// <returns>Retorna en string, el nombre completo del procedimiento</returns>
        private string ProcedimientosDeLaBD(string accion)
        {
            string procedimiento = null;
            switch (accion)
            {
                case "Agregar":
                    procedimiento = "dbo.Tour_AgregarTour";
                    break;
                case "AgregarHorario":
                    procedimiento = "dbo.Tour_AgregarHorario";
                    break;
                case "AsignarHotelTour":
                    procedimiento = "dbo.Tour_AsignarHotelTour";
                    break;
                case "Todos":
                    procedimiento = "dbo.Tour_ConsultarTourTodos";
                    break;
                case "ConsultarPorId":
                    procedimiento = "dbo.Tour_ConsultarTourId";
                    break;
                case "Busqueda":
                    procedimiento = "dbo.Tour_ConsultarTourNomDesc";
                    break;
                case "ConsultaHorario":
                    procedimiento = "dbo.Tour_ConsultarHorarioFkTour";
                    break;
                case "TodosHoteles":
                    procedimiento = "dbo.[Tour_ConsultarTourHotel]";
                    break;
                case "EliminarHorarioPorTour":
                    procedimiento = "dbo.Tour_EliminarHorarioFkTour";
                    break;
                case "Modificar":
                    procedimiento = "dbo.Tour_ModificarTourId";
                    break;
                default:
                    Console.WriteLine("Selección Inválida.\n Opciones: Agregar, Consultar, Eliminar, Modificar, Todos");
                    break;
            }

            return procedimiento;
        }


        /// <summary>
        /// Asignación del objeto de la BD a un objeto tipo Tour
        /// según las posiciones de cada columna especificacda en la consulta
        /// </summary>
        /// <param name="objeto">Objeto leído de la BD tipo SqlDataReader</param>
        /// <returns>Retorna el objeto Tour</returns>
        private Tour AsignarTourConBD(SqlDataReader objeto)
        {
            Tour tour = new Tour();
            try
            {
                tour.IdTour = objeto.GetInt32(0);
                tour.DescripcionTour = objeto.GetString(1);
                tour.PrecioTour = (double)objeto.GetSqlDouble(2);
                tour.CapacidadTour = (int)objeto.GetSqlInt16(3);
                tour.NombreTour = objeto.GetString(4);
                tour.ActivoTour = objeto.GetBoolean(5);                
            }
            catch (InvalidCastException e) { throw new ExcepcionesTours("Casteo Inválido", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }

            return tour;
        }


        /// <summary>
        /// Asignación del objeto de la BD a un objeto tipo Horario
        /// según las posiciones de cada columna especificacda en la consulta
        /// </summary>
        /// <param name="objeto">Objeto leído de la BD tipo SqlDataReader</param>
        /// <returns>Retorna el objeto Tour</returns>
        private Horario AsignarHorarioConBD(SqlDataReader objeto)
        {
            Horario horario = new Horario();
            try
            {
                horario.IdHorario = objeto.GetInt32(0);
                horario.HoraInicio = objeto.GetValue(1).ToString();
                horario.HoraFin = objeto.GetValue(2).ToString();
                horario.Dia = objeto.GetString(3);
                
            }
            catch (InvalidCastException e) { throw new ExcepcionesTours("Casteo Inválido", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }

            return horario;

        }

        /// <summary>
        /// Asignación del objeto de la BD a un objeto tipo Hotel
        /// según las posiciones de cada columna especificacda en la consulta
        /// </summary>
        /// <param name="objeto">Objeto leído de la BD tipo SqlDataReader</param>
        /// <returns>Retorna el objeto Hotel</returns>
        private Hotel AsignarHotelConBD(SqlDataReader objeto)
        {
            Hotel obj = new Hotel();
            try
            {
                obj.IdHotel = objeto.GetInt32(0);
                obj.nombreHotel = objeto.GetString(1);
                obj.descripcionHotel = objeto.GetString(2);
                obj.estrellaHotel = objeto.GetString(3);
                obj.direccionHotel = objeto.GetString(4);

            }
            catch (InvalidCastException e) { throw new ExcepcionesTours("Casteo Inválido", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }

            return obj;

        }


        /// <summary>
        /// Agregación deparametros pre-trabajados
        /// para el comando al que se va a ejecutar
        /// </summary>
        /// <param name="c">comando</param>
        /// <param name="parametros">parametros al comando</param>
        private void AgregarParametrosAComando(SqlCommand c, Dictionary<string, object> parametros)
        {
            foreach (KeyValuePair<string, object> parametro in parametros)
            {
                c.Parameters.AddWithValue(parametro.Key, parametro.Value);
            }
        }

        private OperacionesBD Conexion(string conexion)
        {
            if (conexion != "")
                return new OperacionesBD();
            else
                return new OperacionesBD(_conexion);
        }

        #region Construccion del objeto en diccionario

        /// <summary>
        /// Construccion del diccionario de parametros
        /// para el objeto a guardarse en la base de datos
        /// segun sus atributos a setear
        /// </summary>
        /// <param name="idTour">Id del tour</param>
        /// <param name="dia">Dia del tour (Lunes, Martes, ...)</param>
        /// <param name="horainicio"> Hora de comienzo</param>
        /// <param name="horafin"> Hora de fin</param>
        /// <returns></returns>
        private Dictionary<string, object> ObjetoHorario(int idTour, string dia, string horainicio, string horafin)
        {
            Dictionary<string, object> parametros = new Dictionary<string, object>();

            parametros.Add("@foraneaTour", idTour);
            parametros.Add("@dia", dia);
            parametros.Add("@horaInicio", horainicio);
            parametros.Add("@horaFin", horafin);

            return parametros;
        }


        /// <summary>
        /// Construccion del diccionario de parametros
        /// para el objeto a guardarse en la base de datos
        /// segun sus atributos a setear
        /// </summary>
        /// <param name="nombre">Nombre del tour</param>
        /// <param name="descripcion"> Descripción del tour</param>
        /// <param name="capacidad">Capacidad del tour</param>
        /// <param name="precio">precio del tour</param>
        /// <returns>Retorna el diccionario compuesto</returns>
        private Dictionary<string, object> ObjetoTour(string nombre, string descripcion, int capacidad, int precio)
        {
            Dictionary<string, object> parametros = new Dictionary<string, object>();

            parametros.Add("@nombre", nombre);
            parametros.Add("@descripcion", descripcion);
            parametros.Add("@capacidad", capacidad);
            parametros.Add("@precio", precio);

            return parametros;
        }


        /// <summary>
        /// Construccion del diccionario de parametros
        /// para el objeto a guardarse en la base de datos
        /// segun sus atributos a setear
        /// </summary>
        /// <param name="nombre">Nombre del tour</param>
        /// <param name="descripcion"> Descripción del tour</param>
        /// <param name="capacidad">Capacidad del tour</param>
        /// <param name="precio">precio del tour</param>
        /// /// <param name="activo">activo el tour</param>
        /// <returns>Retorna el diccionario compuesto</returns>
        private Dictionary<string, object> ObjetoModificarTour(int idTour, string nombre, string descripcion, int capacidad, int precio, int activo)
        {
            Dictionary<string, object> parametros = new Dictionary<string, object>();

            parametros.Add("@idTour", idTour);
            parametros.Add("@nombre", nombre);
            parametros.Add("@descripcion", descripcion);
            parametros.Add("@capacidad", capacidad);
            parametros.Add("@precio", precio);
            parametros.Add("@activo", activo);

            return parametros;
        }

        /// <summary>
        /// Construccion del diccionario de parametros
        /// para el objeto a guardarse en la base de datos
        /// segun sus atributos a setear
        /// </summary>
        /// <param name="idHotel">Referencia del hotel</param>
        /// <param name="idTour">Referencia del tour</param>
        /// <returns>Retorna el diccionario compuesto</returns>        
        private Dictionary<string, object> ObjetoAgregarHotelTour(int idHotel, int idTour)
        {
            Dictionary<string, object> parametros = new Dictionary<string, object>();

            parametros.Add("@idHotel", idHotel);
            parametros.Add("@idTour", idTour);

            return parametros;
        }
        
        #endregion

        #endregion

        #region Metodos publicos

        /// <summary>
        /// Metodo para consultar todos los tours 
        /// </summary>
        /// <returns>
        /// Retorna una lista de tours
        /// </returns>
        public List<Tour> ConsultarTours(int idHotel)
        {
            //Generar la conexion
            OperacionesBD operaciones = new OperacionesBD();

            _accion = "Todos";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);
            comando.Parameters.AddWithValue("@idHotel", idHotel);

            SqlDataReader lectura;
            List<Tour> listaTours = new List<Tour>();

            try
            {
                operaciones._cn.Open();
                lectura = comando.ExecuteReader();

                while (lectura.Read())
                {
                    Tour tour = AsignarTourConBD(lectura);
                    if (tour != null)
                    {
                        listaTours.Add(tour);
                    }
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally 
            { 
                operaciones._cn.Close(); 
            }

            return listaTours;
        }

        
        /// <summary>
        /// Metodo para consultar todos los tours 
        /// </summary>
        /// <returns>
        /// Retorna una lista de tours
        /// </returns>
        public List<Tour> ConsultarTour(int idTour)
        {
            OperacionesBD operaciones = new OperacionesBD();

            _accion = "ConsultarPorId";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);
            SqlDataReader lectura;
            List<Tour> listaTours = new List<Tour>();

            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros = new Dictionary<string, object>();
                parametros.Add("@id", idTour);
                AgregarParametrosAComando(comando, parametros);

                lectura = comando.ExecuteReader();

                while (lectura.Read())
                {
                    Tour tour = AsignarTourConBD(lectura);
                    if (tour != null)
                    {
                        listaTours.Add(tour);
                    }
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return listaTours;
        }


        /// <summary>
        /// Consulta del itinerario de un tour
        /// </summary>
        /// <param name="idTour">Tour en específico</param>
        /// <returns>Itinerario del tour</returns>
        public List<Horario> ConsultarHorario(int idTour)
        {
            OperacionesBD operaciones = new OperacionesBD();

            _accion = "ConsultaHorario";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);
            SqlDataReader lectura;
            List<Horario> listaHorario = new List<Horario>();

            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros = new Dictionary<string, object>();
                parametros.Add("@idTour", idTour);
                AgregarParametrosAComando(comando, parametros);

                lectura = comando.ExecuteReader();

                while (lectura.Read())
                {
                    Horario horario = AsignarHorarioConBD(lectura);
                    if (horario != null)
                    {
                        horario.FkTour = idTour;
                        listaHorario.Add(horario);
                    }
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return listaHorario;
        }


        /// <summary>
        /// Busqueda de tours que contenga el parametro
        /// </summary>
        /// <param name="parametro">Valor de busqueda</param>
        /// <returns>Lista de tours que contenga el parametro</returns>
        public List<Tour> BusquedaTours(string parametro, int idHotel)
        {
            OperacionesBD operaciones = new OperacionesBD();

            _accion = "Busqueda";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);
            SqlDataReader lectura;
            List<Tour> listaTours = new List<Tour>();

            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros = new Dictionary<string, object>();
                parametros.Add("@dato", parametro);
                parametros.Add("@idHotel", idHotel);
                AgregarParametrosAComando(comando, parametros);

                lectura = comando.ExecuteReader();

                while (lectura.Read())
                {
                    Tour tour = AsignarTourConBD(lectura);
                    if (tour != null)
                    {
                        listaTours.Add(tour);
                    }
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return listaTours;
        }


        /// <summary>
        /// Metodo para consultar todos los hoteles 
        /// </summary>
        /// <returns>
        /// Retorna una lista de tours
        /// </returns>
        public List<Hotel> ConsultarHoteles()
        {
            //Generar la conexion
            OperacionesBD operaciones = new OperacionesBD();

            _accion = "TodosHoteles";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(_accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);

            SqlDataReader lectura;
            List<Hotel> lista = new List<Hotel>();

            try
            {
                operaciones._cn.Open();
                lectura = comando.ExecuteReader();

                while (lectura.Read())
                {
                    Hotel obj = AsignarHotelConBD(lectura);
                    if (obj != null)
                    {
                        lista.Add(obj);
                    }
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally
            {
                operaciones._cn.Close();
            }

            return lista;
        }




        /// <summary>
        /// Agregar horario según el Tour
        /// </summary>
        /// <returns>
        /// Retorna verdadero si se ha hecho exitosamente
        /// </returns>
        public bool AgregarHorario(int idTour, List<String> listaDia, string horainicio, string horafin)
        {
            OperacionesBD operaciones = new OperacionesBD();

            string accion = "AgregarHorario";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);
            bool exitoso = true;
            int i;
            int cont = 0;

            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros;

                foreach (String dia in listaDia)
                {
                    //descompongo la lista e inserto los horarios
                    if (cont == 0)
                    {
                        parametros = ObjetoHorario(idTour, dia, horainicio, horafin);
                        AgregarParametrosAComando(comando, parametros);
                        cont = cont + 1;
                    }
                    comando.Parameters["@dia"].Value = dia;
                    i = comando.ExecuteNonQuery();
                    if (i <= 0)
                    {
                        exitoso = false;
                        break;
                    }
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return exitoso;
        }


        /// <summary>
        /// Creacion del tour para ser guardado 
        /// </summary>
        /// <param name="nombre">Nombre del tour</param>
        /// <param name="descripcion"> Descripción del tour</param>
        /// <param name="listaDia">Lista de dias de la semana en la que se efectúa</param>
        /// <param name="horainicio"> Hora de incio del tour</param>
        /// <param name="horafin"> Hora fin del tour</param>
        /// <param name="capacidad">Capacidad del tour</param>
        /// <param name="precio">precio del tour</param>
        /// <returns>Retorna el ID tour si se ha realizado la transacción completa</returns>
        public int TourAgregar(string nombre, string descripcion, List<String> listaDia, 
                                string horainicio, string horafin, int capacidad, int precio, int idHotel)
        {
            OperacionesBD operaciones = new OperacionesBD();

            string accion = "Agregar";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);

            int retornoId = 0;
            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros = ObjetoTour(nombre, descripcion, capacidad, precio);
                AgregarParametrosAComando(comando, parametros);

                SqlParameter idtour = new SqlParameter("@id", 0);
                idtour.Direction = ParameterDirection.Output;
                comando.Parameters.Add(idtour);

                int i = comando.ExecuteNonQuery();
                
                if (i > 0)
                {
                    //Llama a AgregarHorario aquí con el IdTour que haya creado
                    int idTour = Convert.ToInt32(comando.Parameters["@id"].Value.ToString());

                    bool agregohorario = AgregarHorario(idTour, listaDia, horainicio, horafin);
                    bool asignarHotelTour = AsignarHotelTour(idTour, idHotel);

                    if (agregohorario && asignarHotelTour)
                    {
                        retornoId = idTour;
                        return retornoId;
                    }
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return retornoId;
        }



        /// <summary>
        /// Creacion del tour para ser guardado 
        /// </summary>
        /// <param name="nombre">Nombre del tour</param>
        /// <param name="descripcion"> Descripción del tour</param>
        /// <param name="listaDia">Lista de dias de la semana en la que se efectúa</param>
        /// <param name="horainicio"> Hora de incio del tour</param>
        /// <param name="horafin"> Hora fin del tour</param>
        /// <param name="capacidad">Capacidad del tour</param>
        /// <param name="precio">precio del tour</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool AsignarHotelTour(int idTourRecibido, int idHotelRecibido)
        {
            OperacionesBD operaciones = new OperacionesBD();

            string accion = "AsignarHotelTour";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);

            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros = ObjetoAgregarHotelTour(idHotelRecibido, idTourRecibido);
                AgregarParametrosAComando(comando, parametros);
                
                int i = comando.ExecuteNonQuery();

                if (i > 0)
                {
                    return true;
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return false;
        }


        /// <summary>
        /// Modificación del tour
        /// </summary>
        /// <param name="nombre">Nombre del tour</param>
        /// <param name="descripcion"> Descripción del tour</param>
        /// <param name="listaDia">Lista de dias de la semana en la que se efectúa</param>
        /// <param name="horainicio"> Hora de incio del tour</param>
        /// <param name="horafin"> Hora fin del tour</param>
        /// <param name="capacidad">Capacidad del tour</param>
        /// <param name="precio">precio del tour</param>
        /// <param name="activo">activo el tour</param>
        /// <returns>Retorna True si se ha realizado la transacción completa</returns>
        public bool ModificarTour(int idTour, string nombre, string descripcion, List<String> listaDia, 
                                    string horainicio, string horafin, int capacidad, int precio, int activo)
        {
            OperacionesBD operaciones = new OperacionesBD();

            string accion = "Modificar";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);

            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros = ObjetoModificarTour(idTour, nombre, descripcion, capacidad, precio, activo);
                AgregarParametrosAComando(comando, parametros);

                int i = comando.ExecuteNonQuery();
                
                if (i > 0)
                {
                    //Llama a AgregarHorario aquí con el IdTour que haya creado
                    //Elimino los horarios establecidos y los vuelvo a cargar con nuevos datos
                     bool eliminarHorario = EliminarHorario(idTour);
                     if (eliminarHorario)
                     {
                         bool agregohorario = AgregarHorario(idTour, listaDia, horainicio, horafin);
                         return true;
                     }
                    
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return false;
        }


        public bool EliminarHorario(int idTour)
        {
            OperacionesBD operaciones = new OperacionesBD();

            string accion = "EliminarHorarioPorTour";    //Palabra clave para consultar el procedimiento necesario
            string procedimiento = ProcedimientosDeLaBD(accion);
            SqlCommand comando = ConsultarProcedimientoAlmacenado(procedimiento, operaciones._cn);

            try
            {
                operaciones._cn.Open();
                Dictionary<string, object> parametros = new Dictionary<string, object>();
                parametros.Add("@idTour", idTour);
                AgregarParametrosAComando(comando, parametros);

                int i = comando.ExecuteNonQuery();

                if (i > 0)
                {
                   return true;
                }
            }
            catch (ArgumentException e) { throw new ExcepcionesTours("Parametros invalidos", e); }
            catch (InvalidOperationException e) { throw new ExcepcionesTours("Operacion Invalida", e); }
            catch (NullReferenceException e) { throw new ExcepcionesTours("Objetos Vacios", e); }
            catch (SqlException e) { throw new ExcepcionesTours("Error con la base de datos", e); }
            catch (Exception e) { throw new ExcepcionesTours("Falla", e); }
            finally { operaciones._cn.Close(); }

            return false;
        }


        #endregion


        #endregion


    }

    
}